package com.bear.sgg.springboot_07_web_jsp.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @ClassNmae MyMvcConfig
 * @Description 通过配置类代替原来的springmvc.xml配置文件
 * @Author bear
 * @Date 2020/3/7 0007 下午 12:17
 */
//通过实现WebMvcConfigurer接口来获取配置spring mvc的功能
//通过@Configuration获取配置Spring的功能
//通过@EnableWebMvc获取全面接管spring mvc的功能（spring boot默认的spring mvc配置将会失效）
//如/默认会返回index.html页面，如果使用了@EnableWebMvc注解，则该默认设置会失效，当浏览器发送/请求时，会返回404错误
//@EnableWebMvc
@Configuration
public class MyMvcConfig implements WebMvcConfigurer{

    /**
     * 配置视图解析器
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //当浏览器发送/index请求时会分发到到index.html页面
        registry.addViewController("/index").setViewName("index");

        //将主页定位到登录页面
        registry.addViewController("/").setViewName("login");
        registry.addViewController("/login").setViewName("login");

    }

    /**
     * 配置拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //拦截所有的请求，除了登录请求和静态资源请求
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/", "/login", "/doLogin")         //登录请求
                .excludePathPatterns("/css/**", "/img/**", "/js/**")    //static/..下的静态资源
                .excludePathPatterns("/webjars/**");                    //各种webjars依赖下的静态资源

        /*
        * spring boot中定义了四个静态资源路径：public/、resources/、static/和META-INF/resources
        * 当浏览器访问静态资源的时候，会从这四个路径中进行查找，如url为http://localhost:8080/test.jpg，spring boot会依次查找上述4个路径
        * 并将/public/test.jpg返回给浏览器。在spring boot 2.X中，当设置了拦截器的时候，静态资源也会被拦截，需要排除掉存放静态资源的路径，
        * 但值得注意的是spring boot查找资源是在拦截器处理完请求后发生的，所以需要放行的静态资源路径并不是public/、resources/、static/和
        * META-INF/resources，而是这些目录的下一级目录。如static/路径下有css、img和js静态资源，浏览器访问时是通过css/**、img/**和js/**进
        * 行访问的，所以真正需要放行的是css/**、img/**和js/**。
        * */
    }


    /**
     * 配置区域解析器
     * @return
     */
    @Bean
    public LocaleResolver localeResolver() {
        return new MyLocaleResolver();
    }


}
